package com.ruoyi.system.service.impl;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.pinyin.PinyinUtil;
import cn.hutool.poi.excel.BigExcelWriter;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.ruoyi.common.annotation.DataSource;
import com.ruoyi.common.core.domain.BaseDto;
import com.ruoyi.common.enums.DataSourceType;
import com.ruoyi.system.dao.MultiLatitudeDao;
import com.ruoyi.system.domain.dto.MultiLatitudDto;
import com.ruoyi.system.domain.vo.MultiLatitudVo;
import com.ruoyi.system.service.MultiLatitudeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@Slf4j
@Service
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
public class MultiLatitudeServiceImpl implements MultiLatitudeService {

    @Resource
    private MultiLatitudeDao multiLatitudeDao;

    public static void main(String[] str) {
        String bk = PinyinUtil.getPinyin("斑块", "");
        System.out.println(bk);

    }

    //    @Override
//    @DataSource(DataSourceType.SLAVE)
//    public PageInfo<MultiLatitudVo.Result> queryByGjz(MultiLatitudDto.Query dto, Integer pageSize, Integer pageNum) throws InterruptedException {
//        List<MultiLatitudVo.Result> results;
//        Integer total = 0;
//        //1.无关键字搜索  直接查询基本信息
////        total = multiLatitudeDao.select_COUNT(dto.getBcgjz(), dto.getRysjStartTime(), dto.getRysjEndTime(), dto.getCysjStartTime(), dto.getCysjEndTime(), dto.getRyks(), dto.getXm(), dto.getZyh(), dto.getJzlshList(), dto.getCsbggjz());
//
//        List<String> jzlshList = new ArrayList<>();
//        if (StrUtil.isEmpty(dto.getBcgjz())) {
//
//            //拆分，  如需要病程关键字或超声关键字或诊断 查询， 则先查询有病程关键字和超声关键字、诊断名称的就诊流水号
//            if (StrUtil.isNotEmpty(dto.getCsbggjz())) {
//                List<String> list = multiLatitudeDao.queryJzlshByCsgjz(dto.getCsbggjz());
//                if (CollectionUtil.isNotEmpty(list)) {
//                    jzlshList.addAll(list);
//                }
//            }
//            if (StrUtil.isNotEmpty(dto.getBcgjz())) {
//                List<String> list = multiLatitudeDao.queryJzlshByBcgjz(dto.getBcgjz());
//                if (CollectionUtil.isNotEmpty(list)) {
//                    jzlshList.addAll(list);
//                }
//            }
//            if (pageNum > 0) {
//                PageHelper.startPage(pageNum, pageSize);
//            }
//            if (CollectionUtil.isNotEmpty(jzlshList)) {
//                dto.setJzlshList(jzlshList);
//            }
//            results = multiLatitudeDao.queryJbxxInfo(pageSize, pageNum, dto.getBcgjz(), dto.getRysjStartTime(), dto.getRysjEndTime(), dto.getCysjStartTime(), dto.getCysjEndTime(), dto.getRyks(), dto.getXm(), dto.getZyh(), dto.getJzlshList(), dto.getCsbggjz());
//        } else {
//            if (pageNum > 0) {
//                PageHelper.startPage(pageNum, pageSize);
//            }
////            total = multiLatitudeDao.selectGJZ_COUNT(dto.getBcgjz(), dto.getRysjStartTime(), dto.getRysjEndTime(), dto.getCysjStartTime(), dto.getCysjEndTime(), dto.getRyks(), dto.getXm(), dto.getZyh(), dto.getJzlshList());
//            results = multiLatitudeDao.select(pageSize, pageNum, dto.getBcgjz(), dto.getRysjStartTime(), dto.getRysjEndTime(), dto.getCysjStartTime(), dto.getCysjEndTime(), dto.getRyks(), dto.getXm(), dto.getZyh(), dto.getJzlshList(), dto.getCsbggjz());
//        }
//        PageInfo<MultiLatitudVo.Result> resultPageInfo = new PageInfo<>(results);
//        resultPageInfo.setPageSize(pageSize);
//        resultPageInfo.setPageNum(pageNum);
//        if (total > 0) {
//            resultPageInfo.setTotal(total);
//        }
//        return resultPageInfo;
//    }

    @Override
    @DataSource(DataSourceType.SLAVE)
    public PageInfo<MultiLatitudVo.Result> queryByGjz(MultiLatitudDto.Query dto, Integer pageSize, Integer pageNum) throws InterruptedException {
        List<MultiLatitudVo.Result> results;
        Integer total = 0;
        //1.无关键字搜索  直接查询基本信息
//        total = multiLatitudeDao.select_COUNT(dto.getBcgjz(), dto.getRysjStartTime(), dto.getRysjEndTime(), dto.getCysjStartTime(), dto.getCysjEndTime(), dto.getRyks(), dto.getXm(), dto.getZyh(), dto.getJzlshList(), dto.getCsbggjz());

        List<String> jzlshList = new ArrayList<>();
        //拆分，  如需要病程关键字或超声关键字或诊断 查询， 则先查询有病程关键字和超声关键字、诊断名称的就诊流水号
//        if (StrUtil.isNotEmpty(dto.getCsbggjz())) {
//            List<String> list = multiLatitudeDao.queryJzlshByCsgjz(dto.getCsbggjz(), dto.getRysjStartTime(), dto.getRysjEndTime());
//            if (CollectionUtil.isNotEmpty(list)) {
//                jzlshList.addAll(list);
//            }
//        }
//        if (StrUtil.isNotEmpty(dto.getBcgjz())) {
//            List<String> list = multiLatitudeDao.queryJzlshByBcgjz(dto.getBcgjz(), dto.getRysjStartTime(), dto.getRysjEndTime());
//            if (CollectionUtil.isNotEmpty(list)) {
//                jzlshList.addAll(list);
//            }
//        }
//        if (StrUtil.isNotEmpty(dto.getZdbm())) {
//            List<String> list = multiLatitudeDao.queryJzlshByZdbm(dto.getZdbm(), dto.getRysjStartTime(), dto.getRysjEndTime());
//            if (CollectionUtil.isNotEmpty(list)) {
//                jzlshList.addAll(list);
//            }
//        }

        try {
            if (pageNum > 0) {
                PageHelper.startPage(pageNum, pageSize);
            }

            results = multiLatitudeDao.queryJbxxInfo(pageSize, pageNum, dto.getBcgjz(), dto.getRysjStartTime(), dto.getRysjEndTime(), dto.getCysjStartTime(), dto.getCysjEndTime(), dto.getRyks(), dto.getXm(), dto.getZyh(), dto.getJzlshList(), dto.getCsbggjz(), dto.getZdbm());
            if (CollectionUtil.isEmpty(results)) {
                return new PageInfo<>();
            }
        }catch (Exception e){
            if (pageNum > 0) {
                PageHelper.startPage(pageNum, pageSize);
            }
            dto.setBcgjz(null);
            results = multiLatitudeDao.queryJbxxInfo(pageSize, pageNum, dto.getBcgjz(), dto.getRysjStartTime(), dto.getRysjEndTime(), dto.getCysjStartTime(), dto.getCysjEndTime(), dto.getRyks(), dto.getXm(), dto.getZyh(), dto.getJzlshList(), dto.getCsbggjz(), dto.getZdbm());
            if (CollectionUtil.isEmpty(results)) {
                return new PageInfo<>();
            }
        }

//        try {
//            for (MultiLatitudVo.Result result : results) {
//                if (StrUtil.isNotEmpty(result.getJzlsh())) {
//                    //查询诊断信息
//                    result.setZl_jbxx_zdmcList(multiLatitudeDao.queryZdxx(result.getJzlsh()));
//                    //查询超声信息
//                    result.setYxResultList(multiLatitudeDao.queryYxjcbgByJzlsh(result.getJzlsh()));
//                }
//            }
//        }catch (Exception e) {
//            log.error("查询超声、诊断信息错误");
//        }
        PageInfo<MultiLatitudVo.Result> resultPageInfo = new PageInfo<>(results);
        resultPageInfo.setPageSize(pageSize);
        resultPageInfo.setPageNum(pageNum);
        return resultPageInfo;
    }

    @Override
    @DataSource(DataSourceType.SLAVE)
    public List<MultiLatitudVo.Result.BcLb> queryDetail(String jzlsh) {
        return multiLatitudeDao.queryProgress(20, 1, null, jzlsh);
    }

    @Override
    @DataSource(DataSourceType.SLAVE)
    public List<MultiLatitudVo.Result.BcLb> queryDetailByGjz(String jzlsh, String bcgjz) {
        return multiLatitudeDao.queryProgressByGjz(bcgjz, jzlsh);
    }

    @Override
    public PageInfo<MultiLatitudVo.Result> select(MultiLatitudDto.Query dto, Integer pageSize, Integer pageNum) {


        return null;
    }

    @Override
    @DataSource(DataSourceType.SLAVE)
    public MultiLatitudVo.QueryDetail queryBasy(String jzlsh) {
        return multiLatitudeDao.queryBasy(jzlsh);
    }

    @Override
    @DataSource(DataSourceType.SLAVE)
    public void exportData(HttpServletResponse response, BaseDto<MultiLatitudDto.Query> dto) throws InterruptedException {
        dto.setPageNum(1);
        dto.setPageSize(5000);
        PageInfo<MultiLatitudVo.Result> resultPageInfo = queryByGjz(dto.getParam(), dto.getPageSize(), dto.getPageNum());
        List<MultiLatitudVo.Result> list = resultPageInfo.getList();
        if (CollectionUtil.isEmpty(list)) {
            return;
        }
        BigExcelWriter bw = new BigExcelWriter();
        List<String> headerList = CollectionUtil.newArrayList(
                "住院号",
                "姓名",
                "超声项目",
                "出院日期",
                "入院日期",
                "入院科室",
                "入院诊断"
        );
        bw.writeHeadRow(headerList);
        int row = 0;
        for (int i = 0; i < list.size(); i++) {
            row += 1;
            bw.writeCellValue(0, row, list.get(i).getZl_jbxx_zyh());
            bw.writeCellValue(1, row, list.get(i).getXm());
            bw.writeCellValue(2, row, list.get(i).getJcxmmc());
            bw.writeCellValue(3, row, list.get(i).getZl_jbxx_cyrq());
            bw.writeCellValue(4, row, list.get(i).getZl_jbxx_zytime());
            bw.writeCellValue(5, row, list.get(i).getRyks());
            bw.writeCellValue(6, row, list.get(i).getZl_jbxx_zdmc());
        }

        String filename = StrUtil.format("dwsj-{}.xlsx", DateUtil.date().toString("yyyyMMdd"));
        //response为HttpServletResponse对象
        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        //test.xls是弹出下载对话框的文件名，不能为中文，中文请自行编码
        response.setHeader("Content-Disposition", "attachment;filename=" + filename);
        ServletOutputStream out = null;
        try {
            out = response.getOutputStream();
            bw.flush(out);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭writer，释放内存
            bw.close();
            //此处记得关闭输出Servlet流
            IoUtil.close(out);
        }
    }

}
